package com.kernel;

import java.lang.reflect.Constructor;

/****************************************
 * @name Constructors
 * @description 构造方法
 * @author 黄彬恒
 * @since 2018/7/11
 ***************************************/
public class Constructors {

    /*
     * 通过Class类对象可以获取到某个类中的：构造方法、成员变量、成员方法；并访问成员；
     *
     * 1.获取构造方法：
     *       ①.批量的方法:
     *           public Constructor[] getConstructors();获取所有"公有的"构造方法
     *           public Constructor[] getDeclaredConstructors();获取所有的构造方法(包括私有、受保护、默认、公有)
     *
     *       ②.获取单个的方法，并调用:
     *           public Constructor getConstructor(Class... parameterTypes);获取单个的"公有的"构造方法;
     *           public Constructor getDeclaredConstructor(Class... parameterTypes);获取“某个构造方法”可以是私有的，或受保护、默认、公有;
     *
     *           调用构造方法:
     *           Constructor-->newInstance(Object... initArgs)
     * */
    public static void main(String[] args) throws Exception {
        /*1.加载Class对象*/
        Class<?> clazz = Class.forName("com.kernel.Student");

        //2.获取所有公有构造方法
        System.out.println("**********************所有公有构造方法*********************************");
        Constructor[] conArray = clazz.getConstructors();
        for (Constructor c : conArray) {
            System.out.println(c);
        }

        System.out.println("************所有的构造方法(包括：私有、受保护、默认、公有)***************");
        conArray = clazz.getDeclaredConstructors();
        for (Constructor c : conArray) {
            System.out.println(c);
        }

        System.out.println("*****************获取公有、无参的构造方法*******************************");
        Constructor con = clazz.getConstructor();
        //1>、因为是无参的构造方法所以类型是一个null,不写也可以：这里需要的是一个参数的类型，切记是类型
        //2>、返回的是描述这个无参构造函数的类对象。

        System.out.println("con = " + con);
        //调用构造方法
        Object obj = con.newInstance();
        //  System.out.println("obj = " + obj);
        //  Student stu = (Student)obj;

        System.out.println("******************获取私有构造方法，并调用*******************************");
        con = clazz.getDeclaredConstructor(int.class);
        System.out.println(con);
        //调用构造方法
        con.setAccessible(true);//暴力访问(忽略掉访问修饰符)
        obj = con.newInstance(23);
    }
}
